import type { IUserInfoVo } from '@/api/login.typings'
import { defineStore } from 'pinia'
import { ref } from 'vue'
import {
  getUserInfo as _getUserInfo,
  login as _login,
  logout as _logout,
  wxLogin as _wxLogin,
  getWxCode,
} from '@/api/login'
import { toast } from '@/utils/toast'

// 初始化状态
const userInfoState: IUserInfoVo = {
  id: 0,
  username: '',
  avatar: '/static/images/default-avatar.png',
  token: '',
}

export const useUserStore = defineStore(
  'user',
  () => {
    // 定义用户信息
    const userInfo = ref<IUserInfoVo>({ ...userInfoState })
    // 设置用户信息
    const setUserInfo = (val: IUserInfoVo) => {
      console.log('设置用户信息', val)
      // 若头像为空 则使用默认头像
      if (!val.avatar) {
        val.avatar = userInfoState.avatar
      }
      else {
        val.avatar = 'https://oss.laf.run/ukw0y1-site/avatar.jpg?feige'
      }
      userInfo.value = val
    }
    const setUserAvatar = (avatar: string) => {
      userInfo.value.avatar = avatar
      console.log('设置用户头像', avatar)
      console.log('userInfo', userInfo.value)
    }
    // 删除用户信息
    const removeUserInfo = () => {
      userInfo.value = { ...userInfoState }
      uni.removeStorageSync('userInfo')
      uni.removeStorageSync('token')
    }
    /**
     * 获取用户信息
     */
    const getUserInfo = async () => {
      const res = await _getUserInfo()
      const userInfo = res.data
      setUserInfo(userInfo)
      // Pinia持久化插件会自动处理本地存储，不需要手动调用uni.setStorageSync
      // TODO 这里可以增加获取用户路由的方法 根据用户的角色动态生成路由
      return res
    }

    /**
     * 刷新用户信息（获取完整信息，包括头像等）
     */
    const refreshUserInfo = async () => {
      try {
        const res = await _getUserInfo()
        const userInfo = res.data
        setUserInfo(userInfo)
        // Pinia持久化插件会自动处理本地存储，不需要手动调用uni.setStorageSync
        return res
      }
      catch (error) {
        console.error('刷新用户信息失败:', error)
        throw error
      }
    }
    /**
     * 用户登录
     * @param credentials 登录参数
     * @returns R<IUserLogin>
     */
    const login = async (credentials: {
      username: string
      password: string
      code: string
      uuid: string
    }) => {
      const res = await _login(credentials)
      console.log('登录信息', res)

      // 直接使用登录接口返回的数据设置用户信息
      if (res.data) {
        const loginData = res.data
        const userInfo: IUserInfoVo = {
          id: Number(loginData.id),
          username: loginData.username,
          avatar: '/static/images/default-avatar.png', // 登录接口不返回头像，使用默认头像
          token: loginData.token,
        }
        setUserInfo(userInfo)
        // Pinia持久化插件会自动处理本地存储，不需要手动调用uni.setStorageSync
      }

      toast.success('登录成功')
      return res
    }

    /**
     * 退出登录 并 删除用户信息
     */
    const logout = async () => {
      _logout()
      removeUserInfo()
    }
    /**
     * 微信登录
     */
    const wxLogin = async () => {
      // 获取微信小程序登录的code
      const data = await getWxCode()
      console.log('微信登录code', data)

      const res = await _wxLogin(data)

      // 直接使用微信登录接口返回的数据设置用户信息
      if (res.data) {
        const loginData = res.data
        const userInfo: IUserInfoVo = {
          id: Number(loginData.id),
          username: loginData.username,
          avatar: '/static/images/default-avatar.png', // 微信登录接口不返回头像，使用默认头像
          token: loginData.token,
        }
        setUserInfo(userInfo)
        // Pinia持久化插件会自动处理本地存储，不需要手动调用uni.setStorageSync
      }

      return res
    }

    return {
      userInfo,
      login,
      wxLogin,
      getUserInfo,
      refreshUserInfo,
      setUserInfo,
      setUserAvatar,
      removeUserInfo,
      logout,
    }
  },
  {
    persist: true,
  },
)
